package algotrader;

import java.util.HashMap;

public class OperadorPregao {
	
	private HashMap<String,HashMap<String,Order>> ordens;
	private IFixApplication fixApp;
	private HashMap<String,OperadorPregaoObserver> observers;
	private OperadorPregaoObserver observerTodosPapeis;
	
	public OperadorPregao(IFixApplication fixApp) {
		this.observers = new HashMap<String, OperadorPregaoObserver>();
		this.fixApp = fixApp;
		this.ordens = new HashMap<String, HashMap<String,Order>>();
		fixApp.setOperadorPregao(this);
	}

	public void sendOrder(Order o) {
		if(!ordens.containsKey(o.getSymbol()))
			ordens.put(o.getSymbol(), new HashMap<String, Order>());
		
		ordens.get(o.getSymbol()).put(o.getId(), o);
		
		this.fixApp.sendOrder(o);
		observers.get(o.getSymbol()).receiveOrder(o);
		observerTodosPapeis.receiveOrder(o);
	}

	public Order getOrder(String simbolo, String o) {
		return ordens.get(simbolo).get(o);
	}

	public void updateOrder(String id,Order o) {
		ordens.get(o.getSymbol()).remove(id);
		ordens.get(o.getSymbol()).put(o.getId(),o);
		
		if(observers.get(o.getSymbol()) != null)
			observers.get(o.getSymbol()).updateOrder(id,o);
		observerTodosPapeis.updateOrder(id,o);
	}
	
	

	public void cancelOrder(Order compra) {
		this.fixApp.solicitaCancelamento(compra);
	}

	public void askToAlterOrder(Order alterada) {
		this.fixApp.solicitaAlteracao(alterada);
	}

	public void addObserver(String simbolo,OperadorPregaoObserver obs) {
		this.observers.put(simbolo, obs);
	}

	public void removeObserver(String ativoOuvido) {
		if(observers.containsKey(ativoOuvido))
			observers.remove(ativoOuvido);
	}

	public void addObserverGeral(OperadorPregaoObserver o) {
		this.observerTodosPapeis = o;
	}

}
